package 链表;

/**
 * @ClassName : _794_有效的井字游戏_from图灵学院leetcode
 * @Author : 骆发茂
 * @Date: 2021/12/9 17:20
 * @Description : https://leetcode-cn.com/problems/valid-tic-tac-toe-state/
 */
public class _794_有效的井字游戏_from图灵学院leetcode {
    public static void main(String[] args) {
        //应该是false才对
        System.out.println(validBoard(new String[]{"XO ", "XO ", "XO "}));
        System.out.println(validBoard(new String[]{"OX ", "OX ", "OX "}));

    }

    public static boolean validBoard(String[] board) {
        int xCount = 0, oCount = 0;
        for (String row : board)
            for (char c : row.toCharArray()) {
                if (c == 'X') xCount++;
                if (c == 'O') oCount++;
            }
        /**从赢的反向角度分析
         * */
        //X是先手
        //X与O 一样多，或者X比O多一个(X赢则X多一个，O赢则一样多)
        /* * X是先先手于O的
         * 1、X必须比O多1个或者相同，否则false； 2、X和O不能同时都是赢家，否则false；
         * 3、X赢的时候必须比O多1个，否则false； 4、O赢得时候个数与X相同，否则false；
         * 局面中不可能出现两者同时赢（其中一方赢后，游戏结束）。*/
        if (win(board, "XXX") && win(board, "OOO")) return false;

        /**         * 由于 X 先手，O 后手，两者轮流下子。因此 O 的数量不会超过 X，且两者数量差不会超过 1，否则为无效局面；
         */
        if (oCount > xCount || xCount - oCount > 1) return false;
        //同时满足  &&，false&&oCount != xCount - 1
        /**         * 若局面是 X 获胜，导致该局面的最后一个子必然是 X，此时必然有 X 数量     大于 O（X 为先手），（同时成立才行）否则为无效局面；
         */
        if (win(board, "XXX") && oCount >= xCount) return false;
        //同时满足  &&，false&&oCount != xCount
        /**         * 若局面是 O 获胜，导致该局面的最后一个子必然是 O，此时必然有 X 数量     等于 O（X 为先手），（同时成立才行）否则为无效局面；
         */
        if (win(board, "OOO") && oCount != xCount) return false;
        return true;
    }
    public static boolean win(String[] board, String flag) {
        for (int i = 0; i < 3; i++) {
            //纵向3连
            if (flag.equals("" + board[0].charAt(i) + board[1].charAt(i) +
                    board[2].charAt(i))) {
                return true;
            }
            //横向3连
            if (flag.equals(board[i])) {
                return true;
            }
        }
        // \向3连
        if (flag.equals("" +
                board[0].charAt(0) + board[1].charAt(1) + board[2].charAt(2)))
            return true;
        // /向3连
        if
        (flag.equals("" + board[0].charAt(2) + board[1].charAt(1) + board[2].charAt(0)))
            return true;
        return false;
    }
}